package org.sql.commands.mysql.filter;

// *************************************************************************/
// Charada Soft
// Area de Desarrollo de Sistemas de Información
// *************************************************************************/
// Proyecto : java connector sql 
// Archivo : In.java
// Descripcion : Clase In
// *************************************************************************/
// Version : 2.10.4
// Fecha de Creación: 30 de Junio de 2014
// Author : Daniel Andres Castillo Pedroza
// *************************************************************************/

import org.sql.commands.mysql.command.ConfiguratorCommand;
import org.sql.commands.Filter;
import org.sql.commands.exception.DMLException;
import org.sql.commands.mysql.command.Select;

public class In implements Filter {

    // Atributos de la clase In
    
    private boolean typeIn = true; 
    private String columna;
    private int numValues;
    private String connector;
    private Select select;

    // Metodos de la clase In
    
    /**
     * Este método nos permite establecer la columna del Filtro In.
     *
     * @param columna Columna del Filtro
     */
    public void setColumna(String columna) {
        this.columna = columna;
    }

    /**
     * Este método nos permite establecer la Cantidad de Datos del Filtro.
     *
     * @param numValues Cantidad de datos del Filtro
     */
    public void setValues(int numValues) {
        this.numValues = numValues; typeIn = true;
    }
    
    /**
     * Este método nos permite establecer un comando Select como filtro.
     * 
     * @param select Comando select para realizar el Filtro
     */
    public void setSelect(Select select) {
        this.select = select; typeIn = false;
    }

    /**
     * Este método nos permite establecer el conector de la Condición.
     *
     * @param connector Conector de la Condición
     */
    public void setConnector(String connector) {
        this.connector = connector;
    }

    // Metodos estáticos de la clase In
    
    /**
     * Este método nos permite crear un Filtro In para un Comando.
     *
     * @param column Columna del Comando
     * @param numValues Cantidad de Datos del Comando
     * @return Retorna el filtro en un objeto <code>In</code>.
     */
    public static In creatorFilter(String column, int numValues) {
        In in = new In(); // Instanciando objeto
        in.setColumna(column); in.setValues(numValues);

        return in; // Retornando Objeto In
    }
    
    /**
     * Este método nos permite crear un Filtro In para un Comando.
     *
     * @param column Columna del Comando
     * @param select Comando select para el Filtro
     * @return Retorna el filtro en un objeto <code>In</code>.
     */
    public static In creatorFilter(String column, Select select) {
        In in = new In(); // Instanciando objeto
        in.setColumna(column); in.setSelect(select);

        return in; // Retornando Objeto In
    }

    /**
     * Este método nos permite crear un Filtro In para un Comando.
     *
     * @param column Columna del Comando
     * @param numValues Cantidad de Datos del Comando
     * @param connector Conector del Filtro
     * @return Retorna el filtro en un objeto <code>In</code>.
     */
    public static In creatorFilter(String column, int numValues, String connector) {
        In in = new In(); // Instanciando objeto
        in.setColumna(column); in.setConnector(connector); in.setValues(numValues);

        return in; // Retornando Objeto In
    }

    /**
     * Este método nos permite crear un Filtro In para un Comando.
     *
     * @param column Columna del Comando
     * @param select Comando select para el Filtro
     * @param connector Conector del Filtro
     * @return Retorna el filtro en un objeto <code>In</code>.
     */
    public static In creatorFilter(String column, Select select, String connector) {
        In in = new In(); // Instanciando objeto
        in.setColumna(column); in.setConnector(connector); in.setSelect(select);

        return in; // Retornando Objeto In
    }

    // Metodos sobreescritos de la clase In
    
    @Override
    public String getFilter() throws DMLException {
        if (typeIn) {
            return "(" + columna + " IN (" + ConfiguratorCommand.valuesForSentence(numValues) + "))";
        } // El filtro se define con valores en la Consulta
        
        else {
            return "(" + columna + " IN (" + select.getCommand() + "))";
        } // El filtro se define con un comando Select
    }

    @Override
    public String getConnector() {
        return connector;
    }
}